package wh.coach._file;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * @author hangwen
 * @date 2023/7/11
 */
public class FileUtils {

    public static void readBuffer(final String path) throws IOException {
        try (FileInputStream fis = new FileInputStream(path)) {

            byte[] data = new byte[5];
            while (fis.read(data) != -1) {
                //为什么会输出多余的内容
                System.out.print(new String(data));
            }

            System.out.print('\n');

        }
        //答：在方法里，data相当于是一辆火车运载货物，在这个方法里，data相当于货物，第一趟装满了 装了五个字节 然后进行第二趟
        // 但是只剩下三个字节，那么data会在前面三个位置装剩下的三个字节但是后面两个位置依然是第一趟装的两个字节

    }

    public static void readOneChar(final String path) throws IOException {
        //try是什么意思 能不能用其他写法

        //答：try是 try-with-Resources语句，在执行完代码块自动关闭资源，即会自动关闭文件输入流，无需明确的再编写关闭资源的代码

        //如果不用try可以使用try-catch-finally
        //eg：
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(path);
            boolean readEnd = false;
            while (!readEnd) {
                final int read = fileInputStream.read();
                if (read != -1) {
                    System.out.print((char) read);
                } else {
                    System.out.print('\n');
                }
                readEnd = read == -1;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (fileInputStream != null) {
                fileInputStream.close();
            }
        }

        try (FileInputStream fis = new FileInputStream(path)) {
            boolean readEnd = false;
            while (!readEnd) {
                final int read = fis.read();
                if (read != -1) {
                    System.out.print((char) read);
                } else {
                    System.out.print('\n');
                }
                readEnd = read == -1;
            }
        }
    }

    public static void readString(final String path) throws IOException {
        try (FileInputStream fis = new FileInputStream(path)) {
            InputStreamReader reader = new InputStreamReader(fis, StandardCharsets.UTF_8);
            BufferedReader bufferedReader = new BufferedReader(reader);

            final String readLine = bufferedReader.readLine();
            System.out.println(readLine);
        }

        //找一些三方库，看看它们是如何读取字符，Apache commonio; guava
//        Apache commonio
//        try (InputStream inputStream = new FileInputStream("myfile.txt")) {
//            String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
//            System.out.println(content);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        //从输入流中的字节读取到一个字节数组中。

////        guava
//        try {
//            File file = new File("myfile.txt");
//            String content = Files.asCharSource(file, Charsets.UTF_8).read();
//            System.out.println(content);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        //直接从文件中读取字节并返回一个字节数组。
        //readAll方法（没办法实现）

        //下节课
        //DataInput
        //我们公司里的一些文件的case
    }

}
